package com.dfbz.demo04_Method;

import org.junit.Test;

import java.lang.reflect.Method;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo02_Method的功能 {

    @Test
    public void test1() throws Exception {
        // 1. 获取字节码对象
        Class<TestEntity> testEntityClass = TestEntity.class;

        // 2. 获取指定的方法
        Method aMethod = testEntityClass.getMethod("a", null);

        // 3. 调用这个Method对象所描述的方法, 返回值就是目标方法的返回值
        Object result = aMethod.invoke(new TestEntity(), null);

        // 这个Method所描述的那个方法的名称
        String methodName = aMethod.getName();

        System.out.println("【"+methodName+"】方法的返回值: " + result);
    }



    @Test
    public void test2() throws Exception {
        // 1. 获取字节码对象
        Class<TestEntity> testEntityClass = TestEntity.class;

        // 2. 获取方法
        Method bMethod = testEntityClass.getMethod("b", String.class);

        bMethod.invoke(new TestEntity(), "哈哈");
    }



    @Test
    public void test3() throws Exception {
        // 1. 获取字节码对象
        Class<TestEntity> testEntityClass = TestEntity.class;

        // 2. 获取方法
        Method cMethod = testEntityClass.getDeclaredMethod("c", null);

        // 只要不是public修饰的方法在访问的时候都加上这一句代码
        cMethod.setAccessible(true);

        cMethod.invoke(new TestEntity(),null);
    }


    @Test
    public void test4() throws Exception {
        // 1. 获取字节码对象
        Class<TestEntity> testEntityClass = TestEntity.class;

        // 2. 获取方法
        Method dMethod = testEntityClass.getMethod("d", null);

        dMethod.invoke(null,null);
    }


    @Test
    public void test5() throws Exception {
        // 1. 获取字节码对象
        Class<TestEntity> testEntityClass = TestEntity.class;

        // 2. 获取方法
        Method dMethod = testEntityClass.getDeclaredMethod("e", null);
        dMethod.setAccessible(true);

        dMethod.invoke(null,null);
    }
}
